package medium

/*
时间复杂度:O(N)
空间复杂度:O(1)

参考: 713. 乘积小于K的子数组.go

注意两点:
1.求窗口值<k, 则内层循环为for val >= k
2.连续子数组有多少个子数组， ans += right-left+1(每次右边界移动，增加的子数组均是以nums[right]为右边界的子数组)
*/

func numSubarrayProductLessThanK1(nums []int, k int) int {
	left, right := 0, 0
	// 存储窗口乘积
	val := 1
	// 记录总数量
	ans := 0
	for right < len(nums) {
		val *= nums[right]
		for left <= right && val >= k {
			val /= nums[left]
			left++
		}
		ans += right - left + 1
		right++
	}
	return ans
}
